package com.adee.java;

import java.util.concurrent.TimeUnit;

/*
* ThreadLocal的底层原理
* 1. ThreadLocal是java中提供的线程本地存储机制，可以利用该机制将数据缓存在线程对象内部，该线程可以在任意时刻、任意方法中获取缓存的数据；
* 2. ThreadLocal底层是通过ThreadLocalMap来实现的，每个Thread对象内部都有一个ThreadLocalMap类型的成员变量，该map的key为
*    ThreadLocal对象，value为实际缓存的数据；
* 3. 如果在线程池中使用ThreadLocal，会造成内存泄露，因为当ThreadLocal使用完后，应该要把设置的key、value，也就是Entry对象进行回收，
*    从而出现内存泄漏，解决办法是，在使用完了ThreadLocal对象之后，手动调用remove方法清除该Entry对象；
* 4. ThreadLocal的经典应用场景就是连接管理（一个线程持有一个连接，该连接对象可以在不同的方法之间进行传递，线程之间不共享同一连接）。
* 5.ThreadLocal最主要的功能是可以实现无锁化，避免线程之间的竞争。
*
* */
public class Test021_ThreadLocal {
    public static void main(String[] args) {
        ThreadLocal<String> tl = new ThreadLocal<>();
        tl.set("value in Thread main");
        for (int i = 1; i <= 5; i++) {
            new Thread(() -> {
                tl.set("value in thread " + Thread.currentThread().getName());
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(tl.get());
            }, "t"+i).start();
        }
        System.out.println(tl.get());
    }
}
